#include <rthw.h>
#include <rtthread.h>
#include <rtdevice.h>
#include <u8g2_port.h>


#define OLED_I2C_PIN_SCL                    58  // PB6
#define OLED_I2C_PIN_SDA                    59  // PB7

#define OLED_THREAD_STACK_SIZE 512
#define OLED_THREAD_NAME "oled_task"

static struct rt_thread oled_thread;
static rt_uint8_t oled_thread_stack[OLED_THREAD_STACK_SIZE];


void oled_entry(void *p)
{
	u8g2_t u8g2;

    // Initialization
    u8g2_Setup_ssd1306_i2c_128x64_noname_f( &u8g2, U8G2_R0, u8x8_byte_sw_i2c, u8x8_rt_gpio_and_delay);
    u8x8_SetPin(u8g2_GetU8x8(&u8g2), U8X8_PIN_I2C_CLOCK, OLED_I2C_PIN_SCL);
    u8x8_SetPin(u8g2_GetU8x8(&u8g2), U8X8_PIN_I2C_DATA, OLED_I2C_PIN_SDA);

    u8g2_InitDisplay(&u8g2);
    u8g2_SetPowerSave(&u8g2, 0);


	while (1)
	{
		// Draw Graphics
		/* full buffer example, setup procedure ends in _f */
		u8g2_ClearBuffer(&u8g2);
		u8g2_SetFont(&u8g2, u8g2_font_ncenB08_tr);
		u8g2_DrawStr(&u8g2, 1, 18, "U8g2 on RT-Thread");
		u8g2_SendBuffer(&u8g2);

		u8g2_SetFont(&u8g2, u8g2_font_unifont_t_symbols);
		u8g2_DrawGlyph(&u8g2, 112, 56, 0x2603 );
		u8g2_SendBuffer(&u8g2);
	}
}

static int oled_init(void)
{
	rt_err_t ret;
	ret = rt_thread_init(&oled_thread, OLED_THREAD_NAME, oled_entry, NULL, oled_thread_stack, OLED_THREAD_STACK_SIZE, RT_MAIN_THREAD_PRIORITY, 20);
	if (ret == RT_EOK)
		rt_thread_startup(&oled_thread);
	return 0;
}

INIT_APP_EXPORT(oled_init);
